// import XLSX from "xlsx";
const XLSX = require('xlsx')
// 第一个表
const workbook1 = XLSX.readFile('./source/示例表格.xlsx');  // 获取excel文件对象 as: Object
const sheetNames1 = workbook1.SheetNames; // 获取excel文件中所有的工作表名字 as: Array
const worksheet1 = workbook1.Sheets[sheetNames1[0]];  // 'Sheet1'表对象 as: Object
const range1 = XLSX.utils.decode_range(worksheet1['!ref']);  // 创建一个数据范围对象 as: Object
console.log(range1);

const outputURL = "./source/_OUTPUT.xlsx"
const jsonDataArr = []
// 表头
const dataKeys = []  // 装表头信息  存放 对象中的属性
// 使用构造函数构造对象 不可行!
// function DataItem () {
//   for (let th = range1.s.c; th <= range1.e.c; ++th) {
//     const keyCell = worksheet1[XLSX.utils.encode_cell({ c: th, r: 0 })].v
//     this[keyCell] = null
//     dataKeys.push(keyCell)
//   }
// }
// DataItem.prototype = { constructor: DataItem }  // 原型上添加原始方法防止被覆盖

initTHeader(range1)

//循环获取单元格值
for (let R = range1.s.r + 1; R <= range1.e.r; ++R) {
  // 初始化个对象
  const oldObj = initItem(R)
  // 对每一行数据进行操作
  const newObj = itemHandler(oldObj)
  jsonDataArr.push(newObj)
}
// console.log(jsonDataArr);

outputExcelFile(jsonDataArr, outputURL)


/**
 * 初始化一个表头数组
 * @param {Object} range 
 */
function initTHeader (range) {
  for (let th = range.s.c; th <= range.e.c; ++th) {
    const keyCell = worksheet1[XLSX.utils.encode_cell({ c: th, r: 0 })].v
    dataKeys.push(keyCell)
  }
}

/**
 * 初始化单条数据项
 * @param {Number} row 
 * @returns item项对象
 */
function initItem (row) {
  // 遍历单个数据对象的各个属性
  // const jsonDataObj = new DataItem()  // 单个数据对象  一行数据  一条信息
  const jsonDataObj = {}  // 单个数据对象  一行数据  一条信息
  for (let C = range1.s.c; C <= range1.e.c; ++C) {
    const cell_address = { c: C, r: row }; //获取单元格地址
    const cellObj = XLSX.utils.encode_cell(cell_address); //根据单元格地址获取单元格
    //获取单元格值
    if (worksheet1[cellObj]) {
      // 如果出现乱码可以使用iconv-lite进行转码
      // row_value += iconv.decode(worksheet[cellObj].v, 'gbk') + ", ";
      const valueCell = worksheet1[cellObj].v;
      // console.log('v:', valueCell);
      jsonDataObj[dataKeys[C]] = valueCell
    }
  }
  return jsonDataObj
}

/**
 * 操作每条数据 jsonDataObj对象操作器
 * @param {Object} jsonDataObj 
 */
function itemHandler (jsonDataObj) {
  // console.log(jsonDataObj['年龄'] > 20 ? jsonDataObj['id'] : jsonDataObj['年龄'] + 20)
  if (jsonDataObj['年龄'] > 20) {
    console.log('年龄大于20的人:', jsonDataObj['姓名'])
  } else {
    jsonDataObj['年龄'] = jsonDataObj['年龄'] + 20
  }
  return jsonDataObj
}

/**
 * 根据JSON数据数组和导出路径导出文件
 * @param {Array} jsonDataArr 
 * @param {urlString} outputURL 
 */
function outputExcelFile (jsonDataArr = [], outputURL = './输出文件.xlsx') {
  // 将数据转成workSheet
  const jsonWorkSheet = XLSX.utils.json_to_sheet(jsonDataArr);
  // console.log(jsonWorkSheet);
  // 构造workBook
  const workBook = {
    SheetNames: ['Sheet1'],
    Sheets: {
      'Sheet1': jsonWorkSheet,
    }
  };
  // 将workBook写入文件
  XLSX.writeFile(workBook, outputURL);
}